OBJETIVO: Presentación y breve panorama de lo que haremos las próximas semanas
Funcionamiento de nuestro cerebro.
Clear your minds!!!
Hay que ubicarnos en donde estamos en base a lo que hacemos actualmente. No todo lo que hacemos hoy esta mal, pero hay aún mas cosas que aprender.
Dónde estamos?
La generación e ingesta de datos hoy es una necesidad, debemos contar con mejores herramientas para el manejo de los mismos. Es muy util en nuestras vidas se consumidores, pero mucho mejor ser generadores y controladores de ellos.
Datos everywhere!
Debemos de empezar por algo, los diferentes lenguajes de programación y otras herramientas denominadas Open Source son un excelente comienzo!!
Python y R para empezar
Necesitamos ver el ecosistema, nuestra realidad y tomar la mejor decisión para ver por donde empezamos, todos los lenguajes son utiles, pero no podemos saberlo todo.
Ecosistema de R
Para discutir la próxima sesión, revisen el articulo, al inicio de cada sesión comentaremos algo similar, ya sea dudas de ustedes ó buenos articulos que recomendaré.
https://www.makeuseof.com/tag/how-programming-affects-brain/
Dudas del Open Source, revisen el siguiente Link https://www.gnu.org/licenses/quick-guide-gplv3.html y naveguen.
OBJETIVO: Breve historia de R y contexto
Ross Ihaka and Robert Gentleman desarrollaron R como un software free cuando impartían clases en la Universidad de Auckland en New Zealand a principios de 1990.
Lo crearon a partir del lenguaje estadístico denominado S y para diferenciar su trabajo usaron una sintaxis similar para su propio uso. En 1993 anunciaron su colaboración en las noticias del mailing list de S, muchas personas se interesaron y se sumaron a la colaboración. Dicha colaboración sigue en pie en el sitio https://www.r-project.org/
El lanzamiento oficial (1.0.0) fue en Febrero del 2000, para ese entonces ya era parte de la fundación de software libre GNU. Actualmente la última versión (3.6) está disponible desde Abril de este año para más de 30 países.
Es un software que ayuda a la manipulación de datos, cálculos aritméticos y visualización de gráficos dinámicos.
El código es de fácil escritura y comprensión.
Excelente para el cálculo de matrices, vectores, algoritmos complejos.
Existe una colección muy amplia de herramientas para el análisis de datos, visualización y otros propósitos. dplyr, data.table, tidyr y ggplot2 algunos de ellos.
Fácil desarrollo de herramientas con buen nivel de interacción como blogdown y xaringan.
Para descargar e instalar R en su última versión, deberán utilizar el siguiente link https://cran.r-project.org/bin/windows/base/ donde encontraran la versión para Windows que es el sistema operativo que todos tenemos.
Un lenguaje amigable, fácil de usar y entender, simple y efectivo.
Con R se distribuyen algunos paquetes, pero existen muchos más en el sitio CRAN, cubriendo así un amplio espectro de herramientas estadísticas, de cálculo y de visualización que les harán más divertida la vida.
El link con todo el material del curso esta en mi repo personal de Git, tengan cuidado de no aruinarlo, luego hacemos otro curso de Git. https://github.com/ricardolastra/Workshop_Seguros
En los próximos días les hare llegar documentos como estos, los cuales les serán de gran apoyo con cosas básicas, no podemos retener todo en mente, además que no cubriremos muchos comandos, ejemplos y funciones de las paqueterías.
Para las siguientes sesiones usaremos una interface muy “Fancy” denominada RStudio, la cual podrán descargar en el siguiente link https://www.rstudio.com/products/rstudio/download/ que los llevara a tener la versión más reciente 1.2.1335
Existen más programas o UI´s muy padres, Anaconda (luego revisan el siguiente link) https://www.anaconda.com/distribution/ tiene excelentes herramientas con Python y aun para R. Sin embargo una de las mejores herramientas con R es RStudio.
No nos perdemos de mucho, échenle un ojo.
OBJETIVO: Vistazo de Rstudio y primeros comandos
Recordando…
R es un lenguaje computacional diseñado para la estadística.
Recuerden que cualquier cosa que escriban en R muy probablemente no seran los primeros en intentarlo, hay una gran posibilidad que alguien ya haya escrito algun paquete justo para lo que necesitan.
Hecharemos un vistazo a la parte basica de RStudio que nos permitira entender el funcionamiento del lenguaje, sus alcances, sus aplicaciones y sus ventajas sobre las herramientas actuales que conocemos.
Inicien RStudio y abran un R script:
File -> New File -> R scriptFile -> Save As -> ruta a su carpeta y nombre del fileAhora traten de reproducir las siguientes notas.
Nota. Recuerden el simbolo # para comentar su codigo.
FORMAS DE DECLARAR Ó GUARDAR Ó ALMACENAR Ó MANTENER VARIABLES:
x = 3
y <- 4
5 -> z
Asi estan almacenadas en el ambiente:
x
## [1] 3
y
## [1] 4
z
## [1] 5
Nota. Los valores que guardamos pueden ser usados en subsecuentes operaciones, recuerden que lo mas limpio es poner el nombre a la izquierda y los valores a la derecha.
SOBRESCRIBIR VARIABLES:
x = 4
y <- 5
6 -> z
Asi estan almacenadas en el ambiente:
x
## [1] 4
y
## [1] 5
z
## [1] 6
CALCULOS BASICOS:
Operadores
#SUMAS
25+25
## [1] 50
x+y
## [1] 9
#MULTIPLICACIONES
35*2
## [1] 70
#DIVISIONES
x/y
## [1] 0.8
#RESTAS
z-x-y
## [1] -3
#Potencias
3^2
## [1] 9
y^x
## [1] 625
CALCULOS BASICOS
FORMAS DE NO HACER CALCULOS BASICOS, ASI NO ES LA SINTAXIS DE R:
#SUMAS
#=25+25
#MULTIPLICACIONES
#(35)(2)
VECTORES
#Basicos
x <- c(1,4,3,1,3,2,2,2)
x[1]
## [1] 1
x[2]
## [1] 4
x[2:4]
## [1] 4 3 1
x[-1]
## [1] 4 3 1 3 2 2 2
x[-4]
## [1] 1 4 3 3 2 2 2
x[x<=3]
## [1] 1 3 1 3 2 2 2
#Función which (más adelante veremos, for, while, ifelse)
#Devuelve la posición del elemento que pidamos validar.
which(x==1)
## [1] 1 4
#Quizá con el alfabeto es más claro.
which(letters == "g")
## [1] 7
x==1
## [1] TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
#Mas complejos con operaciones, guardamos vectores
Cebollas.huacal <- c(12,4,4,6,9,3)
Chiles.caja <- c(5,3,2,2,12,9)
#Multiplicamos vectores
Cebollas.precio <- Cebollas.huacal *200
Chiles.precio <- Chiles.caja *100
#Sumamos vectores
Cebollas.precio + Chiles.precio
## [1] 2900 1100 1000 1400 3000 1500
#Tambien lo podemos hacer asi en 1 sola linea
Cebollas.huacal *200 + Chiles.caja *100
## [1] 2900 1100 1000 1400 3000 1500
OBJETOS
objeto <- 3*3
FUNCIONES
myfun = function(x, y){
return (x*y)
}
myfun(3,4)
## [1] 12
myfun2 = function(x, n=2){
return(x^n)
}
myfun2(4)
## [1] 16
myfun2(2, n=3)
## [1] 8
R LOOP´S (While - For)
Sintaxis WHILE:
while (test_expression){ statement }
i <- 1
while (i < 6) {
print(i)
i = i+1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
Sintaxis FOR:
for(var in seq){ expr }
for (año in c(2014,2015,2016,2017,2018,2019)){
print(paste("El año actual es", año))
}
## [1] "El año actual es 2014"
## [1] "El año actual es 2015"
## [1] "El año actual es 2016"
## [1] "El año actual es 2017"
## [1] "El año actual es 2018"
## [1] "El año actual es 2019"
Aún mejor…
for (año in 2014:2019){
print(paste("El año actual es", año))
}
## [1] "El año actual es 2014"
## [1] "El año actual es 2015"
## [1] "El año actual es 2016"
## [1] "El año actual es 2017"
## [1] "El año actual es 2018"
## [1] "El año actual es 2019"
lo ideal…
años <- c(2014,2015,2016,2017,2018,2019)
for (i in años){
print(paste("El año actual es", i))
}
## [1] "El año actual es 2014"
## [1] "El año actual es 2015"
## [1] "El año actual es 2016"
## [1] "El año actual es 2017"
## [1] "El año actual es 2018"
## [1] "El año actual es 2019"
R FUNCTION´S (Ifelse - Which)
Sintaxis IFELSE:
ifelse(test, yes, no)
plazo <- c(6,9,12,24,30)
ifelse(plazo==9, "aplica" , "no aplica")
## [1] "no aplica" "aplica" "no aplica" "no aplica" "no aplica"
más divertido…
plazo <- c(6,9,12,24,30)
ifelse(plazo>=9 & plazo<=24, "aplica" , "no aplica")
## [1] "no aplica" "aplica" "aplica" "aplica" "no aplica"
Sintaxis WHICH:
which(x, arr.ind = FALSE, useNames = TRUE)
which(letters == "g")
## [1] 7
Nota. Para más detalles consulten los documentos de apoyo del repo de git en el documento refcard_2.0_operators_others
OBJETIVO: Como cargar datos, paquetes y librerias
Cargando nuestros datos
R tiene algunas formas de leer archivos, los mas comunes son tablas, archivos planos, archivos con alguna codificacion especifica o estructurada. Aunque no sera el objetivo del curso, leer cadenas de texto, datos sin estructuras definidas o espcificas y archivos sin algun tipo de orden, es algo que tambien se puede hacer en R.
Para leer datos de un archivo, primero deben saber que tipo de archivo es, es decir, su extension. La tabla de abajo muestra una lista de funciones que pueden ser importadas segun el formato del archivo.
| tipo de datos | funcion | paquete |
|---|---|---|
| comma separated (.csv) | read_csv() |
readr |
| other delimited formats | read_delim() |
readr |
| R (.Rds) | read_rds() |
readr |
| Stata (.dta) | read_dta() |
haven |
| SPSS (.sav) | read_spss() |
haven |
| SAS (.sas7bdat) | read_sas() |
haven |
| Excel (.xls, .xlsx) | read_excel() |
readxl |
| regular delimited files | fread() |
data.table |
Nota. Mas información ver documento de apoyo data-import
Paqueterias de R ó los famosos packages
Los paquetes de R pueden ser instalados desde el famoso CRAN, el cual es una red de archivos de alta gama. Para ello deberán usar la función install.packages. Cuando instalan un paquete ponen una copia en la computadora de forma local, pero aun no lo hace “usable”, solo esta “disponible”. Para usarlo deberan adjuntar o cargar la funcion de library.
Gracias a nuestro amigo Hadley y otros colaboradores, en este curso usaremos para prueba de carga el famoso “the tidyverse”. Tidyverse nos brinda grandes herramientas para manipulación basica y avanzada de datos, es muy funcional, facíl e intuitiva.
install.packages("tidyverse")
library(tidyverse)
## -- Attaching packages ------------------------------------------ tidyverse 1.2.1 --
## v ggplot2 3.1.1 v purrr 0.3.2
## v tibble 2.1.1 v dplyr 0.8.0.1
## v tidyr 0.8.3 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.4.0
## -- Conflicts --------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
Nota. Ayuda en R
Podemos usar la función help o el operador al inicio de cada sentencia ?.
#help(help)
#?str
Cargando nuestro primer archivo:
read_csv("bases/PRIMAS_EJE_CARGA.csv")
## Warning: Missing column names filled in: 'X2' [2], 'X3' [3], 'X4' [4],
## 'X5' [5], 'X6' [6], 'X7' [7], 'X8' [8], 'X9' [9], 'X10' [10], 'X11' [11],
## 'X12' [12]
## Parsed with column specification:
## cols(
## `TITULOS FEOS DE REPORTES CLASICOS DE SIISA` = col_character(),
## X2 = col_character(),
## X3 = col_character(),
## X4 = col_character(),
## X5 = col_character(),
## X6 = col_character(),
## X7 = col_character(),
## X8 = col_character(),
## X9 = col_character(),
## X10 = col_character(),
## X11 = col_character(),
## X12 = col_character()
## )
## # A tibble: 23,347 x 12
## `TITULOS FEOS D~ X2 X3 X4 X5 X6 X7 X8 X9 X10
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 2 POLIZA ENDO~ ID_C~ PRIMA PATE~ MATE~ NOMB~ NOMB~ SEXO PLAZO
## 3 D00- 201901 1 1 2097~ MURR~ GAREY LETI~ <NA> F 15
## 4 D00- 201901 2 2 3202~ MEZA MEZA OMAR <NA> M 15
## 5 D00- 201901 1 3 6028~ LOPEZ ARAG~ AARON FEDE~ M 21
## 6 D00- 201901 2 4 8425~ CARD~ GUEV~ AARON IVAN M 21
## 7 D00- 201901 1 5 2842~ JAVI~ MARQ~ AARON ALEJ~ M 27
## 8 D00- 201901 2 6 1593~ CAST~ RANG~ AARON <NA> M 9
## 9 D00- 201901 1 7 1403~ GUER~ RODR~ AARON <NA> M 15
## 10 D00- 201901 2 8 3766~ BENC~ RUBIO AARON MART~ M 9
## # ... with 23,337 more rows, and 2 more variables: X11 <chr>, X12 <chr>
UPS!! Problemas!!!
Hagamos que este disponible la libreria…
library(readr)
read_csv("bases/PRIMAS_EJE_CARGA.csv")
## Warning: Missing column names filled in: 'X2' [2], 'X3' [3], 'X4' [4],
## 'X5' [5], 'X6' [6], 'X7' [7], 'X8' [8], 'X9' [9], 'X10' [10], 'X11' [11],
## 'X12' [12]
## Parsed with column specification:
## cols(
## `TITULOS FEOS DE REPORTES CLASICOS DE SIISA` = col_character(),
## X2 = col_character(),
## X3 = col_character(),
## X4 = col_character(),
## X5 = col_character(),
## X6 = col_character(),
## X7 = col_character(),
## X8 = col_character(),
## X9 = col_character(),
## X10 = col_character(),
## X11 = col_character(),
## X12 = col_character()
## )
## # A tibble: 23,347 x 12
## `TITULOS FEOS D~ X2 X3 X4 X5 X6 X7 X8 X9 X10
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 2 POLIZA ENDO~ ID_C~ PRIMA PATE~ MATE~ NOMB~ NOMB~ SEXO PLAZO
## 3 D00- 201901 1 1 2097~ MURR~ GAREY LETI~ <NA> F 15
## 4 D00- 201901 2 2 3202~ MEZA MEZA OMAR <NA> M 15
## 5 D00- 201901 1 3 6028~ LOPEZ ARAG~ AARON FEDE~ M 21
## 6 D00- 201901 2 4 8425~ CARD~ GUEV~ AARON IVAN M 21
## 7 D00- 201901 1 5 2842~ JAVI~ MARQ~ AARON ALEJ~ M 27
## 8 D00- 201901 2 6 1593~ CAST~ RANG~ AARON <NA> M 9
## 9 D00- 201901 1 7 1403~ GUER~ RODR~ AARON <NA> M 15
## 10 D00- 201901 2 8 3766~ BENC~ RUBIO AARON MART~ M 9
## # ... with 23,337 more rows, and 2 more variables: X11 <chr>, X12 <chr>
Clasico de SIISA y nuestros amigos de TI!!!
library(readr)
read_csv("bases/PRIMAS_EJE_CARGA.csv", skip = 2)
## Parsed with column specification:
## cols(
## POLIZA = col_character(),
## ENDOSO = col_double(),
## ID_CONS = col_double(),
## PRIMA = col_double(),
## PATERNO = col_character(),
## MATERNO = col_character(),
## NOMBRE = col_character(),
## NOMBRE_2 = col_character(),
## SEXO = col_character(),
## PLAZO = col_double(),
## SEG_SOCIAL = col_double(),
## ID_PROD = col_double()
## )
## # A tibble: 23,345 x 12
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2 SEXO PLAZO
## <chr> <dbl> <dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <dbl>
## 1 D00- ~ 1 1 20975. MURRIE~ GAREY LETIC~ <NA> F 15
## 2 D00- ~ 2 2 32022. MEZA MEZA OMAR <NA> M 15
## 3 D00- ~ 1 3 60285. LOPEZ ARAGON AARON FEDERICO M 21
## 4 D00- ~ 2 4 8425. CARDONA GUEVARA AARON IVAN M 21
## 5 D00- ~ 1 5 28429. JAVIER MARQUEZ AARON ALEJAND~ M 27
## 6 D00- ~ 2 6 15936. CASTIL~ RANGEL AARON <NA> M 9
## 7 D00- ~ 1 7 14032. GUERRE~ RODRIG~ AARON <NA> M 15
## 8 D00- ~ 2 8 3767. BENCOMO RUBIO AARON MARTIN M 9
## 9 D00- ~ 1 9 1742. GARCIA RAMON AARON NEFTALI M 3
## 10 D00- ~ 2 10 16206. SEGUNDO DIONIC~ AARON MELCHOR M 15
## # ... with 23,335 more rows, and 2 more variables: SEG_SOCIAL <dbl>,
## # ID_PROD <dbl>
primas <- read_csv("bases/PRIMAS_EJE_CARGA.csv", skip = 2, n_max = 5)
## Parsed with column specification:
## cols(
## POLIZA = col_character(),
## ENDOSO = col_double(),
## ID_CONS = col_double(),
## PRIMA = col_double(),
## PATERNO = col_character(),
## MATERNO = col_character(),
## NOMBRE = col_character(),
## NOMBRE_2 = col_character(),
## SEXO = col_character(),
## PLAZO = col_double(),
## SEG_SOCIAL = col_double(),
## ID_PROD = col_double()
## )
#install.packages("data.table")
library(data.table)
##
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
##
## between, first, last
## The following object is masked from 'package:purrr':
##
## transpose
primas_fread <- fread("bases/PRIMAS_EJE_CARGA.csv", skip = 2, sep = ",")
head(primas_fread,5)
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2
## 1: D00- 201901 1 1 20975.47 MURRIETA GAREY LETICIA
## 2: D00- 201901 2 2 32021.65 MEZA MEZA OMAR
## 3: D00- 201901 1 3 60285.43 LOPEZ ARAGON AARON FEDERICO
## 4: D00- 201901 2 4 8425.26 CARDONA GUEVARA AARON IVAN
## 5: D00- 201901 1 5 28428.92 JAVIER MARQUEZ AARON ALEJANDRO
## SEXO PLAZO SEG_SOCIAL ID_PROD
## 1: F 15 1 720
## 2: M 15 2 700
## 3: M 21 1 700
## 4: M 21 1 700
## 5: M 27 1 700
Ahora validamos ó exploramos los datos que cargamos en el ambiente con las siguientes funciones estadísticas
class(primas_fread)
## [1] "data.table" "data.frame"
Podemos obtener aún más
library(dplyr)
glimpse(primas_fread)
## Observations: 23,345
## Variables: 12
## $ POLIZA <chr> "D00- 201901", "D00- 201901", "D00- 201901", "D00- ...
## $ ENDOSO <int> 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, ...
## $ ID_CONS <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ...
## $ PRIMA <dbl> 20975.47, 32021.65, 60285.43, 8425.26, 28428.92, 15...
## $ PATERNO <chr> "MURRIETA", "MEZA", "LOPEZ", "CARDONA", "JAVIER", "...
## $ MATERNO <chr> "GAREY", "MEZA", "ARAGON", "GUEVARA", "MARQUEZ", "R...
## $ NOMBRE <chr> "LETICIA", "OMAR", "AARON", "AARON", "AARON", "AARO...
## $ NOMBRE_2 <chr> "", "", "FEDERICO", "IVAN", "ALEJANDRO", "", "", "M...
## $ SEXO <chr> "F", "M", "M", "M", "M", "M", "M", "M", "M", "M", "...
## $ PLAZO <int> 15, 15, 21, 21, 27, 9, 15, 9, 3, 15, 15, 15, 21, 9,...
## $ SEG_SOCIAL <int> 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, ...
## $ ID_PROD <int> 720, 700, 700, 700, 700, 720, 700, 720, 700, 700, 7...
Un poco más
str(primas_fread)
## Classes 'data.table' and 'data.frame': 23345 obs. of 12 variables:
## $ POLIZA : chr "D00- 201901" "D00- 201901" "D00- 201901" "D00- 201901" ...
## $ ENDOSO : int 1 2 1 2 1 2 1 2 1 2 ...
## $ ID_CONS : int 1 2 3 4 5 6 7 8 9 10 ...
## $ PRIMA : num 20975 32022 60285 8425 28429 ...
## $ PATERNO : chr "MURRIETA" "MEZA" "LOPEZ" "CARDONA" ...
## $ MATERNO : chr "GAREY" "MEZA" "ARAGON" "GUEVARA" ...
## $ NOMBRE : chr "LETICIA" "OMAR" "AARON" "AARON" ...
## $ NOMBRE_2 : chr "" "" "FEDERICO" "IVAN" ...
## $ SEXO : chr "F" "M" "M" "M" ...
## $ PLAZO : int 15 15 21 21 27 9 15 9 3 15 ...
## $ SEG_SOCIAL: int 1 2 1 1 1 1 1 1 1 1 ...
## $ ID_PROD : int 720 700 700 700 700 720 700 720 700 700 ...
## - attr(*, ".internal.selfref")=<externalptr>
la mejor información!!!
summary(primas_fread)
## POLIZA ENDOSO ID_CONS PRIMA
## Length:23345 Min. : 1.000 Min. : 1 Min. : -2335
## Class :character 1st Qu.: 1.000 1st Qu.: 5837 1st Qu.: 5637
## Mode :character Median : 2.000 Median :11673 Median : 11046
## Mean : 1.504 Mean :11673 Mean : 14705
## 3rd Qu.: 2.000 3rd Qu.:17509 3rd Qu.: 19253
## Max. :33.000 Max. :23345 Max. :415787
## PATERNO MATERNO NOMBRE
## Length:23345 Length:23345 Length:23345
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## NOMBRE_2 SEXO PLAZO SEG_SOCIAL
## Length:23345 Length:23345 Min. : 3.00 Min. :1.000
## Class :character Class :character 1st Qu.: 9.00 1st Qu.:1.000
## Mode :character Mode :character Median :15.00 Median :1.000
## Mean :16.18 Mean :1.137
## 3rd Qu.:21.00 3rd Qu.:1.000
## Max. :34.00 Max. :4.000
## ID_PROD
## Min. : 242
## 1st Qu.: 638
## Median : 700
## Mean : 669
## 3rd Qu.: 700
## Max. :1780
El artículo a discutir al inicio de la sesión numero 3 es el siguiente:
https://www.elfinanciero.com.mx/tech/por-que-tus-hijos-deberian-aprender-a-programar
OBJETIVO: Manejo de datos
Normalmente los datos en R son almacenados como data.frame
Un data.frame es una lista de vectores de la misma longitud, piensenlos como una tabla de observaciones (individuos), cada entrada del vector en la lista forma una columna, cada columna puede ser de diferente tipo, conocemos a las columnas como variables y a las filas como observaciones.
Un data.frame tiene entonces dos dimensiones correspondientes al numero de filas y columnas, en ese estricto orden.
Empezaremos a hacer nuestros primeros subsets, muy utiles en la vida real.
Empezamos con un clasico, filter
filter(primas_fread, PLAZO == 34 & SEXO == "F")
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2
## 1 D00- 201901 1 16619 18224.27 HERNANDEZ MORALES MARIA DEL CARMEN
## SEXO PLAZO SEG_SOCIAL ID_PROD
## 1 F 34 1 1780
filter(primas_fread, PLAZO == 3, NOMBRE %in% c("AARON", "RICARDO"))
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE
## 1 D00- 201901 1 9 1742.10 GARCIA RAMON AARON
## 2 D00- 201901 2 16 4997.92 REYES URBINA AARON
## 3 D00- 201901 1 17 9411.26 DE LA ROSA SOTO AARON
## 4 D00- 201901 2 22 1086.45 TORRES ALONSO AARON
## 5 D00- 201901 2 20218 7138.09 RAMIREZ MAAS RICARDO
## 6 D00- 201901 1 20241 3867.84 OCEGUERA GOMEZ RICARDO
## 7 D00- 201901 2 20242 3911.27 JUAREZ RAMIREZ RICARDO
## 8 D00- 201901 2 20256 3892.39 MARTINEZ GARCIA RICARDO
## 9 D00- 201901 2 20274 3905.70 FLORES GARCIA RICARDO
## 10 D00- 201901 1 20275 3107.25 BURGOS GAMONEDA RICARDO
## 11 D00- 201901 1 20291 3440.37 MORENO OLIVA RICARDO
## 12 D00- 201901 2 20304 13680.13 NAVA CERVANTES RICARDO
## 13 D00- 201901 1 20305 16946.59 NAVA CERVANTES RICARDO
## 14 D00- 201901 1 20325 8340.28 FRANCISCO JUAREZ RICARDO
## 15 D00- 201901 1 20345 10971.09 RENTERIA SALAS RICARDO
## 16 D00- 201901 1 20347 3140.36 ALTAMIRANO PIZARRO RICARDO
## NOMBRE_2 SEXO PLAZO SEG_SOCIAL ID_PROD
## 1 NEFTALI M 3 1 700
## 2 ADRIAN M 3 1 700
## 3 ALBERTO M 3 1 700
## 4 EMMANUEL M 3 1 700
## 5 M 3 1 700
## 6 M 3 1 754
## 7 ALBERTO M 3 1 700
## 8 ANTONIO M 3 1 700
## 9 M 3 1 700
## 10 M 3 1 700
## 11 M 3 1 700
## 12 FRANCISCO M 3 1 700
## 13 M 3 1 700
## 14 M 3 1 700
## 15 DARIO M 3 1 700
## 16 M 3 1 700
Buen acceso a ciertas observaciones, slice
slice(primas_fread, 1:5)
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2
## 1 D00- 201901 1 1 20975.47 MURRIETA GAREY LETICIA
## 2 D00- 201901 2 2 32021.65 MEZA MEZA OMAR
## 3 D00- 201901 1 3 60285.43 LOPEZ ARAGON AARON FEDERICO
## 4 D00- 201901 2 4 8425.26 CARDONA GUEVARA AARON IVAN
## 5 D00- 201901 1 5 28428.92 JAVIER MARQUEZ AARON ALEJANDRO
## SEXO PLAZO SEG_SOCIAL ID_PROD
## 1 F 15 1 720
## 2 M 15 2 700
## 3 M 21 1 700
## 4 M 21 1 700
## 5 M 27 1 700
Que pasó aqui?
head(slice(primas_fread,-c(1,2)))
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2
## 1 D00- 201901 1 3 60285.43 LOPEZ ARAGON AARON FEDERICO
## 2 D00- 201901 2 4 8425.26 CARDONA GUEVARA AARON IVAN
## 3 D00- 201901 1 5 28428.92 JAVIER MARQUEZ AARON ALEJANDRO
## 4 D00- 201901 2 6 15935.75 CASTILLO RANGEL AARON
## 5 D00- 201901 1 7 14032.46 GUERRERO RODRIGUEZ AARON
## 6 D00- 201901 2 8 3766.85 BENCOMO RUBIO AARON MARTIN
## SEXO PLAZO SEG_SOCIAL ID_PROD
## 1 M 21 1 700
## 2 M 21 1 700
## 3 M 27 1 700
## 4 M 9 1 720
## 5 M 15 1 700
## 6 M 9 1 720
Revisemos con un head y un tail
head(primas_fread)
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2
## 1: D00- 201901 1 1 20975.47 MURRIETA GAREY LETICIA
## 2: D00- 201901 2 2 32021.65 MEZA MEZA OMAR
## 3: D00- 201901 1 3 60285.43 LOPEZ ARAGON AARON FEDERICO
## 4: D00- 201901 2 4 8425.26 CARDONA GUEVARA AARON IVAN
## 5: D00- 201901 1 5 28428.92 JAVIER MARQUEZ AARON ALEJANDRO
## 6: D00- 201901 2 6 15935.75 CASTILLO RANGEL AARON
## SEXO PLAZO SEG_SOCIAL ID_PROD
## 1: F 15 1 720
## 2: M 15 2 700
## 3: M 21 1 700
## 4: M 21 1 700
## 5: M 27 1 700
## 6: M 9 1 720
tail(primas_fread)
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE
## 1: D00- 201901 2 23340 1923.02 PEDRAZA PE?A ZURISADDAI
## 2: D00- 201901 1 23341 15031.21 PINTO DUARTE ZURISADDAI
## 3: D00- 201901 2 23342 14564.44 ESPA?A PEREZ ZUSET
## 4: D00- 201901 1 23343 5693.09 QUINTERO GARCIA ZUXCEL
## 5: D00- 201901 2 23344 12837.95 ESCOBAR SANCHEZ ZYANYA
## 6: D00- 201901 3 23345 30091.90 VALENCIA LOPEZ ZYZLILA
## NOMBRE_2 SEXO PLAZO SEG_SOCIAL ID_PROD
## 1: F 15 4 642
## 2: F 27 4 638
## 3: F 15 1 638
## 4: CRISTINA F 27 1 638
## 5: MARIANA F 27 1 638
## 6: F 9 1 638
Entonces slice y filter se usan para extraer algun tipo de “observación, row, fila, value, entrada, etc.”, de la misma forma usamos select para acceder a las columnas.
select(slice(primas_fread, 23340:23345), c(PATERNO, MATERNO, NOMBRE))
## PATERNO MATERNO NOMBRE
## 1 PEDRAZA PE?A ZURISADDAI
## 2 PINTO DUARTE ZURISADDAI
## 3 ESPA?A PEREZ ZUSET
## 4 QUINTERO GARCIA ZUXCEL
## 5 ESCOBAR SANCHEZ ZYANYA
## 6 VALENCIA LOPEZ ZYZLILA
…podemos usar algo super util como el simbolo de $, el cual nos ayudara a acceder a una columna especifica de un df
sd(primas_fread$PRIMA)
## [1] 14830.78
o tambien…
mean(primas_fread$PRIMA)
## [1] 14704.87
Ejercicio 1
El objetivo del siguiente ejericio es para que practiquen, algunas cosas que hemos aprendido, traten de hacerlo siguiendo las notas, recuerden que deben de tener instalado y cargado el tidyverse.
Usen el archivo que esta en la carpeta de las bases de mi repo denominado PRIMAS_EJE_AUTOS.csv.
readr, y limiten la lectura a 20 rows.
Revisen el siguiente video para comentarlo la proxima sesión.
OBJETIVO: Pipes, datos en forma tidy y vervos de la librería
Sigan cuidadosamente las siguientes instrucciones, inicien RStudio y generen un nuevo proyecto:
File -> New Project... -> Existing Directory -> Browse... -> seleccionar carpeta destino -> Open -> Create ProjectFile -> New File -> R scriptFile -> Save As -> ruta a su carpeta y nombre del filedplyr(en caso de no tenerlo aún)
Debemos cargar el archivo ART_492_JUNIO_2019 con varias pestañas, contribucion de nuestro amigo LEE.
De la siguiente forma cargamos 1 sola pestaña, pero no es la escencia de esto.
library(dplyr)
library(readxl)
pestaña <- read_excel("C:/Users/Administrador/Desktop/DOC/WORKSHOP_R/ART_492_JUNIO_2019.xlsx", sheet = 2)
head(pestaña)
Revisamos de la siguiente manera las pestañas y seleccionamos la que queremos revisar.
#recuerden que el path de cada equipo es diferente
ruta <- "C:/Users/Administrador/Desktop/DOC/WORKSHOP_R/ART_492_JUNIO_2019.xlsx"
excel_sheets(path = ruta)
## [1] "SERGIO CARBALLO (2)" "AGENTES SERGIO CARBALLO"
## [3] "MARCELA HUERTA (2)" "JOSE MARIA GARCIA (2)"
## [5] "JORGE VERGARA MACIP" "JOSE MARIA GARCIA"
## [7] "JERRY O´HEA (2)" "JERRY O´HEA"
## [9] "SERGIO CARBALLO" "MICHAEL SCHITTEK"
## [11] " AGENTES MICHAEL" "MARCELA HUERTA"
## [13] "ADEUDOS TOTAL" "DETALLE POR ANALISTA"
## [15] "Hoja6"
Ojo. Muestra inclusive las pestañas que est ocultas.
Cargamos el archivo y la pestaña deseada:
emision <- read_excel(path = ruta, sheet = "SERGIO CARBALLO")
head(emision)
Revisamos los datos:
summary(emision)
Verbos de dplyr que usaremos:
Provided by https://dplyr.tidyverse.org/
Nota. Usaremos un simbolo muy curioso para todo esto, operator(%>%)
Iniciamos con el verbo mutate(), el cual nos genera una nueva variable a partir de la suma de columnas seleccionadas que contienen cierta condición.
emision_modificado <- emision %>%
mutate(CUENTA_DOCS = rowSums(.[24:43]=="Si", na.rm=TRUE))
Revisamos como quedo el nuevo dataset.
head(emision_modificado)
emision_modificado <- emision_modificado %>%
mutate(PORCENTAJE_CUMPLI = (CUENTA_DOCS/43)*100)
#Revisamos la nueva variable
summary(emision_modificado$PORCENTAJE_CUMPLI)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 0.000 1.975 0.000 13.953
Ahora revisamos que hace el verbo select().
emision_res <- emision_modificado %>%
select(c("Sucursal","Nombre Sucursal","Prima Convertida"))
colnames(emision_res)
## [1] "Sucursal" "Nombre Sucursal" "Prima Convertida"
No guardamos lo siguiente en la variable, solo observen que pasa.
emision_modificado %>%
select(ends_with("ramo")) %>%
head()
## # A tibble: 6 x 4
## Ramo `Descripcion Ramo` Subramo `Descripcion Subramo`
## <dbl> <chr> <dbl> <chr>
## 1 7 PAQUETE 3 OBRAS CIVILES
## 2 3 TRANSPORTES 5 CASCOS DE BUQUES
## 3 7 PAQUETE 3 OBRAS CIVILES
## 4 7 PAQUETE 5 MULTIPLE EMPRESARIAL
## 5 7 PAQUETE 5 MULTIPLE EMPRESARIAL
## 6 3 TRANSPORTES 1 TRANSPORTES DE CARGA
Y el verbo filter() similar al que ya habiamos visto.
emision_modificado <- emision_modificado %>%
filter(`Descripcion Ramo` == "AUTOMOVILES", Subramo %in% c(1,2))
head(emision_modificado)
## # A tibble: 6 x 69
## `#` Sucursal `Nombre Sucursa~ `Prima Converti~ Agente `Razon Social`
## <dbl> <chr> <chr> <dbl> <dbl> <chr>
## 1 1 D00 MEXICO 661200. 1593 GRUPO DE ASES~
## 2 1 D00 MEXICO 570791. 628 WILLIS AGENTE~
## 3 1 D00 MEXICO 442108. 628 WILLIS AGENTE~
## 4 1 D70 METRO INSURGENT~ 297605. 6161 MURGUIA CONSU~
## 5 1 D00 MEXICO 245154. 828 ASESORES PROF~
## 6 1 D70 METRO INSURGENT~ 216150. 6161 MURGUIA CONSU~
## # ... with 63 more variables: Ramo <dbl>, `Descripcion Ramo` <chr>,
## # Subramo <dbl>, `Descripcion Subramo` <chr>, Ejecutivo...11 <chr>,
## # Directivo...12 <chr>, Ejecutivo...13 <chr>, Directivo...14 <chr>,
## # RFC <chr>, IdAseg <chr>, `Razón Social` <chr>, `Fecha de Alta` <dttm>,
## # `Fecha de Art. 140` <dttm>, Observaciones <chr>, `Tipo Persona` <dbl>,
## # `Clientes 2016 2017 2018` <dbl>, Moneda <dbl>, Póliza <chr>, `1
## # IDENTIFICACION OFICIAL"` <chr>, `2 CLAVE UNICA DE REGISTRO DE
## # POBLACION (CURP)...26` <chr>, `3 CEDULA DE IDENTIFICACION FISCAL
## # (RFC)...27` <chr>, `4 COMPROBANTE DE DOMICILIO...28` <chr>, `8 FORMATO
## # CONOCE A TU CLIENTE...29` <chr>, `1 TESTIMONIO NOTARIAL O COPIA DEL
## # ACTA COSTITUTIVA` <chr>, `2 CEDULA DE IDENTIFICACION FISCAL
## # (RFC)` <chr>, `3 COMPROBANTE DE DOMICILIO` <chr>, `4 TESTIMONIO O
## # COPIA DEL PODER NOTARIAL DEL REPRESENTANTE LEGAL` <chr>, `5
## # IDENTIFICACION OFICIAL DEL REPRESENTANTE LEGAL` <chr>, `6 ESCRITO
## # FIRMADO QUE ACREDITA LA INSCRIPCION RESPECTIVA (EMPRESA DE RECIENTE
## # CONSTITUCION)` <chr>, `8 FORMATO CONOCE A TU CLIENTE...36` <chr>, `99
## # DATOS COMPLETOS...37` <chr>, `1 TESTIMONIO O COPIA CERTIFICADA DEL
## # PODER NOTARIAL` <lgl>, `2 CONSTANCIA DE NOMBRAMIENTO, EXPEDIDA EN
## # TERMINOS DEL ART. 90 DE LA LEY DE INST. DE SEGUROS` <lgl>, `3
## # IDENTIFICACION OFICIAL DEL REPRESENTANTEO REPRESENTANTES LEGALES DE LA
## # ENTIDAD` <lgl>, `4 COMPROBANTE DE DOMICILIO...41` <lgl>, `5 CEDULA DE
## # IDENTIFICACION FISCAL (RFC)` <lgl>, `8 FORMATO CONOCE A TU
## # CLIENTE...43` <lgl>, `9 Y/O ACTA DE MAYORIA QUE SE LE ENTREGA AL
## # PRESIDENTE MUNICIPAL Y LEY ORGANICA DE LA ADMINISTRACION PU` <lgl>,
## # `99 DATOS COMPLETOS...45` <lgl>, `1 IDENTIFICACION OFICIAL` <lgl>, `2
## # CLAVE UNICA DE REGISTRO DE POBLACION (CURP)...47` <lgl>, `3 CEDULA DE
## # IDENTIFICACION FISCAL (RFC)...48` <lgl>, `4 COMPROBANTE DE
## # DOMICILIO...49` <lgl>, `8 FORMATO CONOCE A TU CLIENTE...50` <lgl>, `99
## # DATOS COMPLETOS...51` <lgl>, `5 CARTA PODER DEL APODERADO
## # LEGAL` <lgl>, `6 IDENTIFICACION DEL APODERADO LEGAL` <lgl>, `7
## # COMPROBANTE DE DOMICILIO DEL APODERADO LEGAL` <lgl>, `1 PASAPORTE
## # ORIGINAL Y/O DOCUMENTO QUE ACREDITE SU LEGAL ESTANCIA EN TERRITORIO
## # MEXICANO...55` <lgl>, `4 COMPROBANTE DE DOMICILIO...56` <lgl>, `8
## # FORMATO CONOCE A TU CLIENTE...57` <lgl>, `1 COPIA LEGISLADA O
## # APOSTILLADA DEL DOCTO. QUE ACREDITE SU LEGAL EXISTENCIA` <lgl>, `2
## # COPIA LEGISLADA O APOSTILLADA DEL PODER DEL REPRESENTANTE LEGAL (NAL.
## # O EXT.)` <lgl>, `3 COPIA DE LA IDENTIFICACION PERSONAL OFICIAL DEL
## # REPRESENTANTE O REPRESENTANTES LEGALES` <lgl>, `4 COMPROBANTE DE
## # DOMICILIO...61` <lgl>, `8 FORMATO CONOCE A TU CLIENTE...62` <lgl>, `99
## # DATOS COMPLETOS...63` <lgl>, `1 PASAPORTE ORIGINAL Y/O DOCUMENTO QUE
## # ACREDITE SU LEGAL ESTANCIA EN TERRITORIO MEXICANO...64` <lgl>, `4
## # COMPROBANTE DE DOMICILIO...65` <lgl>, `8 FORMATO CONOCE A TU
## # CLIENTE...66` <lgl>, `99 DATOS COMPLETOS...67` <lgl>,
## # CUENTA_DOCS <dbl>, PORCENTAJE_CUMPLI <dbl>
El siguiente verbo summarise() es de gran utilidad, lo usaremos mucho, esperen a que lleguemos al mundo visual de ggplot.
Tenemos la variable emision_res que tiene la extracción de solo 3 columnas, la usamos.
emision_res <- emision_res %>%
group_by(Sucursal) %>%
summarise(cuenta = n())
emision_res
## # A tibble: 4 x 2
## Sucursal cuenta
## <chr> <int>
## 1 <NA> 50
## 2 D00 191
## 3 D70 10
## 4 F04 1
Y por ultimo un verbo para ordenar o acomodar nuestros valores muy usado es arrange()
emision_res %>%
arrange(desc(cuenta))
emision_res <- emision_res %>%
arrange(cuenta)
emision_res
## # A tibble: 4 x 2
## Sucursal cuenta
## <chr> <int>
## 1 F04 1
## 2 D70 10
## 3 <NA> 50
## 4 D00 191
Quiamos espacios feos de los nombres de columnas:
names(emision) <- gsub(" ", "_", names(emision))
colnames(emision)
## [1] "#"
## [2] "Sucursal"
## [3] "Nombre_Sucursal"
## [4] "Prima_Convertida"
## [5] "Agente"
## [6] "Razon_Social"
## [7] "Ramo"
## [8] "Descripcion_Ramo"
## [9] "Subramo"
## [10] "Descripcion_Subramo"
## [11] "Ejecutivo...11"
## [12] "Directivo...12"
## [13] "Ejecutivo...13"
## [14] "Directivo...14"
## [15] "RFC"
## [16] "IdAseg"
## [17] "Razón_Social"
## [18] "Fecha_de_Alta"
## [19] "Fecha_de_Art._140"
## [20] "Observaciones"
## [21] "Tipo_Persona"
## [22] "Clientes_2016_2017_2018"
## [23] "Moneda"
## [24] "Póliza"
## [25] "1_IDENTIFICACION_OFICIAL\""
## [26] "2_CLAVE_UNICA_DE_REGISTRO_DE_POBLACION_(CURP)...26"
## [27] "3_CEDULA_DE_IDENTIFICACION_FISCAL_(RFC)...27"
## [28] "4_COMPROBANTE_DE_DOMICILIO...28"
## [29] "8_FORMATO_CONOCE_A_TU_CLIENTE...29"
## [30] "1_TESTIMONIO_NOTARIAL_O_COPIA_DEL_ACTA_COSTITUTIVA"
## [31] "2_CEDULA_DE_IDENTIFICACION_FISCAL_(RFC)"
## [32] "3_COMPROBANTE_DE_DOMICILIO"
## [33] "4_TESTIMONIO_O_COPIA_DEL_PODER_NOTARIAL_DEL_REPRESENTANTE_LEGAL"
## [34] "5_IDENTIFICACION_OFICIAL_DEL_REPRESENTANTE_LEGAL"
## [35] "6_ESCRITO_FIRMADO_QUE_ACREDITA_LA_INSCRIPCION_RESPECTIVA_(EMPRESA_DE_RECIENTE_CONSTITUCION)"
## [36] "8_FORMATO_CONOCE_A_TU_CLIENTE...36"
## [37] "99_DATOS_COMPLETOS...37"
## [38] "1_TESTIMONIO_O_COPIA_CERTIFICADA_DEL_PODER_NOTARIAL"
## [39] "2_CONSTANCIA_DE_NOMBRAMIENTO,_EXPEDIDA_EN_TERMINOS_DEL_ART._90_DE_LA_LEY_DE_INST._DE_SEGUROS"
## [40] "3_IDENTIFICACION_OFICIAL_DEL_REPRESENTANTEO_REPRESENTANTES_LEGALES_DE_LA_ENTIDAD"
## [41] "4_COMPROBANTE_DE_DOMICILIO...41"
## [42] "5_CEDULA_DE_IDENTIFICACION_FISCAL_(RFC)"
## [43] "8_FORMATO_CONOCE_A_TU_CLIENTE...43"
## [44] "9_Y/O_ACTA_DE_MAYORIA_QUE_SE_LE_ENTREGA_AL_PRESIDENTE_MUNICIPAL_Y_LEY_ORGANICA_DE_LA_ADMINISTRACION_PU"
## [45] "99_DATOS_COMPLETOS...45"
## [46] "1_IDENTIFICACION_OFICIAL"
## [47] "2_CLAVE_UNICA_DE_REGISTRO_DE_POBLACION_(CURP)...47"
## [48] "3_CEDULA_DE_IDENTIFICACION_FISCAL_(RFC)...48"
## [49] "4_COMPROBANTE_DE_DOMICILIO...49"
## [50] "8_FORMATO_CONOCE_A_TU_CLIENTE...50"
## [51] "99_DATOS_COMPLETOS...51"
## [52] "5_CARTA_PODER_DEL_APODERADO_LEGAL"
## [53] "6_IDENTIFICACION_DEL_APODERADO_LEGAL"
## [54] "7_COMPROBANTE_DE_DOMICILIO_DEL_APODERADO_LEGAL"
## [55] "1_PASAPORTE_ORIGINAL_Y/O_DOCUMENTO_QUE_ACREDITE_SU_LEGAL_ESTANCIA_EN_TERRITORIO_MEXICANO...55"
## [56] "4_COMPROBANTE_DE_DOMICILIO...56"
## [57] "8_FORMATO_CONOCE_A_TU_CLIENTE...57"
## [58] "1_COPIA_LEGISLADA_O_APOSTILLADA_DEL_DOCTO._QUE_ACREDITE_SU_LEGAL_EXISTENCIA"
## [59] "2_COPIA_LEGISLADA_O_APOSTILLADA_DEL_PODER_DEL_REPRESENTANTE_LEGAL_(NAL._O_EXT.)"
## [60] "3_COPIA_DE_LA_IDENTIFICACION_PERSONAL_OFICIAL_DEL_REPRESENTANTE_O_REPRESENTANTES_LEGALES"
## [61] "4_COMPROBANTE_DE_DOMICILIO...61"
## [62] "8_FORMATO_CONOCE_A_TU_CLIENTE...62"
## [63] "99_DATOS_COMPLETOS...63"
## [64] "1_PASAPORTE_ORIGINAL_Y/O_DOCUMENTO_QUE_ACREDITE_SU_LEGAL_ESTANCIA_EN_TERRITORIO_MEXICANO...64"
## [65] "4_COMPROBANTE_DE_DOMICILIO...65"
## [66] "8_FORMATO_CONOCE_A_TU_CLIENTE...66"
## [67] "99_DATOS_COMPLETOS...67"
…y la magia de dplyr es: un solo PIPE!!!!!
emision %>%
mutate(CUENTA_DOCS = rowSums(.[24:43]=="Si", na.rm=TRUE)) %>%
mutate(PORCENTAJE_CUMPLI = (CUENTA_DOCS/43)*100) %>%
select(c("Sucursal","Nombre_Sucursal","Prima_Convertida","PORCENTAJE_CUMPLI")) %>%
filter(PORCENTAJE_CUMPLI>0) %>%
group_by(Sucursal ,Nombre_Sucursal) %>%
summarise(Prima_Prom = sum(Prima_Convertida)/n(),
Cumplimiento_prom= sum(PORCENTAJE_CUMPLI)/n())
## # A tibble: 1 x 4
## # Groups: Sucursal [1]
## Sucursal Nombre_Sucursal Prima_Prom Cumplimiento_prom
## <chr> <chr> <dbl> <dbl>
## 1 D00 MEXICO 266124. 10.6
Dejamos todas las sucursales, lo guardan en su variable y listo!!!
emision_resumen <- emision %>%
mutate(CUENTA_DOCS = rowSums(.[24:43]=="Si", na.rm=TRUE)) %>%
mutate(PORCENTAJE_CUMPLI = (CUENTA_DOCS/43)*100) %>%
select(c("Sucursal","Nombre_Sucursal","Prima_Convertida","PORCENTAJE_CUMPLI")) %>%
filter(PORCENTAJE_CUMPLI>=0) %>%
group_by(Sucursal ,Nombre_Sucursal) %>%
summarise(Adeudos = n(),
Prima_Prom = sum(Prima_Convertida)/n(),
Cumplimiento_prom= sum(PORCENTAJE_CUMPLI)/n()) %>%
na.omit() %>%
arrange(Adeudos)
emision_resumen
## # A tibble: 3 x 5
## # Groups: Sucursal [3]
## Sucursal Nombre_Sucursal Adeudos Prima_Prom Cumplimiento_prom
## <chr> <chr> <int> <dbl> <dbl>
## 1 F04 METRO ARCOS 1 281196. 0
## 2 D70 METRO INSURGENTES 10 196118. 0
## 3 D00 MEXICO 191 241681. 2.61
Aplausos!!!
Para la siguiente sesión comentaremos esta lectura:
OBJETIVO: Graficar entendiendo los datos, escalas y tipos de gráficos, mejorar visualizaciones actuales
Empezamos usando unos nuevos datos fake con propositos didacticos.
library(dplyr)
emision <- read.csv("./bases/Consolidados-7.csv", header = T, stringsAsFactors=F)
…exploramos un poco…
str(emision)
## 'data.frame': 28 obs. of 4 variables:
## $ Año.Contable : int 2019 2019 2019 2019 2019 2019 2019 2018 2018 2018 ...
## $ Nombre.Director: chr "GERARDO PEREZ" "GEORGE W BUSH" "CHEMA" "MARCE VERDURAS" ...
## $ Emitida : chr "2,661,351,720.69" "419,558,997.10" "1,016,438,189.37" "732,761,487.80" ...
## $ Pagada : chr "2,464,282,560.52" "382,555,636.68" "1,063,419,000.60" "954,516,475.69" ...
Un regalo!
#Quitamos las comas y redondeamos la cifra, ademas que guardamos la variable como entero
library(readr)
emision <- emision %>%
mutate(Emitida = parse_number(Emitida),
Pagada = parse_number(Pagada))
#parse_number esta dentro de readr
revisamos de nuevo:
str(emision)
## 'data.frame': 28 obs. of 4 variables:
## $ Año.Contable : int 2019 2019 2019 2019 2019 2019 2019 2018 2018 2018 ...
## $ Nombre.Director: chr "GERARDO PEREZ" "GEORGE W BUSH" "CHEMA" "MARCE VERDURAS" ...
## $ Emitida : num 2.66e+09 4.20e+08 1.02e+09 7.33e+08 3.72e+09 ...
## $ Pagada : num 2.46e+09 3.83e+08 1.06e+09 9.55e+08 2.87e+09 ...
Ahora si pudieron cargar tidyverse solo habiliten la libreria.
library(ggplot2)
Si NO pudieron cargar tidyverse, descarguen ggplot2 y habiliten la libreria.
install.packages("ggplot2")
library(ggplot2)
Ventajas de ggplot2:
¿Cómo se usa?
Empezamos con la función ggplot(), integrando nuestra base y sus variables (con aes()). Luego agregamos las coordenadas o puntos a graficar con geom_point() o con geom_histogram(), luego las escalas ó colores (como puede ser scale_colour_brewer()), algunas especificaciones como facet_wrap() y hasta títulos o marcas.
¿Y si graficamos con R base? ggplot2 VS R base de una manera muy sencilla.
hist(emision$Emitida)
Y con ggplot2 se ve lo mismo de la siguiente forma:
ggplot(emision, aes(x = Emitida)) +
geom_histogram()
Sin embargo hay que graficar cosas que hagan sentido, pero antes revisemos un poco mas.
Aesthetic Mapping
En el mundo de ggplot2 aesthetic significa “algo que puedes ver”. Puedes incluir las siguientes opciones:
Cada tipo de gráfico solo acepta un conjunto de datos, es natural de una gráfica de dos dimensiones.
Objetos geométricos (geom)
Son los tipos de gráficos que tenemos en cada imagen:
geom_point, para scatter plots, dot plots, etc.)geom_line, para time series, trend lines, etc.)geom_boxplot)Un gráfico al menos debe tener un objeto geométrico, y pueden ir agregando más con el símbolo +, que al ponerlo lo identa de manera correcta.
Puedes tener una buena ayuda con los objetos disponibles de la siguiente forma:
help.search("geom_", package = "ggplot2")
Pongamos datos reales…
#Quitamos la basura
emision <- emision %>%
filter(Nombre.Director != "NO INFORMADO")
Ordenamos y hacemos un sencillo resumen
emision_anual <- emision %>%
group_by(Año.Contable) %>%
summarise(Prima_E = sum(Emitida))
emision_anual
## # A tibble: 4 x 2
## Año.Contable Prima_E
## <int> <dbl>
## 1 2016 10827627985.
## 2 2017 12318125772.
## 3 2018 14202526793.
## 4 2019 10182639580.
Y graficamos
ggplot(emision_anual, aes(y = Prima_E, x = Año.Contable)) +
geom_point()
Agregamos leyendas en ambos ejes
ggplot(emision_anual, aes(y = Prima_E, x = Año.Contable)) +
geom_point() +
scale_x_continuous(limits = c(2015, 2020))+
ylab("Prima Emitida Acumulada")+
xlab("Año contable")
Un poco mejor
ggplot(emision_anual, aes(y = Prima_E, x = Año.Contable)) +
geom_point(size= 6, alpha= .6) +
scale_x_continuous(limits = c(2015.5, 2019.5))+
ylab("Prima Emitida Acumulada")+
xlab("Año contable")
O mejor asi
ggplot(emision_anual, aes(y = Prima_E, x = Año.Contable)) +
geom_point(size= 6, alpha= .6) +
geom_line(color= "red") +
scale_x_continuous(limits = c(2015.5, 2019.5))+
ylab("Prima Emitida Acumulada")+
xlab("Año contable")
Sin embargo podemos hacer mejores visualizaciones con mejores datos…
Volvemos a ordenar el set original
emision_director <- emision %>%
filter(Nombre.Director != "NO INFORMADO") %>%
group_by(Nombre.Director, Año.Contable) %>%
summarise(Prima_E = sum(Emitida),
Prima_P = sum(Pagada))
emision_director
## # A tibble: 24 x 4
## # Groups: Nombre.Director [6]
## Nombre.Director Año.Contable Prima_E Prima_P
## <chr> <int> <dbl> <dbl>
## 1 CHEMA 2016 1276115429. 1261107000.
## 2 CHEMA 2017 1399058109. 1351242103.
## 3 CHEMA 2018 1585929111. 1581205688.
## 4 CHEMA 2019 1016438189. 1063419001.
## 5 EL BAILADOR 2016 1503532561. 1426823176.
## 6 EL BAILADOR 2017 1631954516. 1545986628.
## 7 EL BAILADOR 2018 1874743990. 1832613076.
## 8 EL BAILADOR 2019 1634953994. 1285381085.
## 9 GEORGE W BUSH 2016 413164395. 332089523.
## 10 GEORGE W BUSH 2017 394549120. 390359735.
## # ... with 14 more rows
y ahora si toma sentido!!
ggplot(emision_director, aes(y = Prima_E, x = Año.Contable, colour = Nombre.Director)) +
geom_point(size= 6, alpha= .7) +
scale_x_continuous(limits = c(2015.5, 2019.5))+
ylab("Prima Emitida Acumulada")+
xlab("Año contable")
O mejor aun…se puede?
ggplot(emision_director, aes(x = Año.Contable, y = Nombre.Director)) +
geom_point(aes(size = Prima_E), alpha = 0.4) +
scale_size(range = c(0.5, 16)) #Ajusta el tamaño de los circulos
Podemos agregar algunas librerias que nos ayudan a mejorar las visualizaciones.
#install.packages("ggpubr")
library(ggpubr)
# Teniendo otros datos esta visualización es buenisima
ggscatterhist(
emision_director, x = "Prima_E", y = "Prima_P",
color = "Nombre.Director", size = 5, alpha = 0.7,
margin.params = list(fill = "Nombre.Director", color = "black", size = 0.4)
)
O podemos hacer algunas ya un poco conocidas…
ggplot(emision_director, aes(x = Año.Contable, y = Prima_E)) +
geom_col(aes(color = Nombre.Director, fill = Nombre.Director), position = position_stack())
de mis favoritas
# Multiple line plot
ggplot(emision_director, aes(x = Año.Contable, y = Prima_E)) +
geom_line(aes(color = Nombre.Director), size = 1) +
theme_minimal()
Le subimos el volumen!!!
#Obtenemos los datos de CHEM@
emi_chema <- emision %>%
filter(Nombre.Director == "CHEMA",
Año.Contable != "2019") %>%
group_by(Nombre.Director, Año.Contable) %>%
summarise(Prima_E = sum(Emitida),
Prima_P = sum(Pagada))
#Una regresion lineal sencilla
#Obtenemos los coeficientes
regresion <- lm(Prima_E~Año.Contable, data = emi_chema)
#Ajustamos
emi_chema$prediccion <- predict(regresion)
#De mejor interpretación
p1 <- ggplot(emi_chema, aes(x = Año.Contable, y = Prima_E))
p1 + geom_point() +
scale_x_continuous(limits = c(2016, 2018)) +
geom_line(aes(y = prediccion))
Agregamos unas bandas de confianza representadas por una sombra
p1 + geom_point() +
scale_x_continuous(limits = c(2016, 2018)) +
geom_line(aes(y = prediccion)) +
geom_smooth()
…pero y el año 2019 y el 2020 como va a cerrar? Ideas??
Seguimos con la magia!
conf1 <- predict(regresion,interval="confidence")
pred1 <- predict(regresion,interval="prediction")
Pasamos los siguientes dos años…
new <- data.frame(Año.Contable=seq(2019,2020,length=2))
conf2 <- predict(regresion,interval="confidence",newdata=new)
pred2 <- predict(regresion,interval="prediction",newdata=new)
new$prediccion <- predict(regresion,newdata=new)
new
## Año.Contable prediccion
## 1 2019 1730181232
## 2 2020 1885088074
y lo graficamos para que se entienda mejor
emi_chema_pred <-bind_rows(emi_chema,new)
p2 <- ggplot(emi_chema_pred, aes(x = Año.Contable, y = Prima_E))
p2 + geom_point(size= 2) +
scale_x_continuous(limits = c(2016, 2020)) +
geom_line(aes(y = prediccion)) +
geom_point(aes(y = prediccion),color= "blue", size= 3, alpha = 0.4)
revisamos el detalle que nos da “lm”, las bandas de confianza y de predicción
par(las=1,bty="l") ## formato
plot(Prima_E~Año.Contable,data=emi_chema,ylim=c(120000000,2650000000),xlim=c(2016,2020)) ## datos originales
abline(regresion) ## ajuste del modelo
matlines(emi_chema$Año.Contable,conf1[,c("lwr","upr")],col=2,lty=1,type="b",pch="+")
matlines(emi_chema$Año.Contable,pred1[,c("lwr","upr")],col=2,lty=2,type="b",pch=1)
matlines(new$Año.Contable,conf2[,c("lwr","upr")],col=4,lty=1,type="b",pch="+")
matlines(new$Año.Contable,pred2[,c("lwr","upr")],col=4,lty=2,type="b",pch=1)
Mas ideas, revisen el siguiente link:
https://www.datanovia.com/en/blog/ggplot-examples-best-reference/
Buenisimos tutoriales, muchas gracias a los amigos de datanovia!!!
Ademas pueden revisar el documento de apoyo data-visualization-2.1.pdf que esta en el repo del Workshop.
A work by Ricardo Lastra
ricardolcuevas@gmail.com